package com.yunhe.option.service.base;

import com.yunhe.option.domain.base.Area;
import com.yunhe.common.exception.ArgumentErrorException;
import com.yunhe.common.exception.ObjectNotFoundException;
import com.yunhe.common.exception.UniqueConstraintsException;
import com.yunhe.common.model.PageParam;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;
import java.util.Optional;

/**
 * 地区Service
 *
 * @author liuronglei
 * @desc 地区服务类定义
 */
@Service
public interface AreaService {

    /**
     * 新增地区
     *
     * @param area 新增对象
     */
    @Transactional
    Area create(Area area, Long parentId)
            throws ArgumentErrorException, UniqueConstraintsException, ObjectNotFoundException;

    /**
     * 批量新增地区
     *
     * @param list 地区列表
     */
    @Transactional
    Iterable<Area> create(List<Area> list)
            throws ArgumentErrorException, UniqueConstraintsException;

    /**
     * 根据id删除地区
     *
     * @param areaId id
     */
    @Transactional
    void deleteById(Long areaId);

    /**
     * 根据地区代码删除地区
     *
     * @param code 地区代码
     */
    @Transactional
    Long deleteByCode(Long code);

    /**
     * 根据地区编号删除地区
     *
     * @param name 地区编号
     */
    @Transactional
    Long deleteByName(String name);

    /**
     * 更新地区（更新全部字段）
     *
     * @param area 要更新的地区对象
     */
    @Transactional
    Area update(Area area)
            throws ArgumentErrorException, UniqueConstraintsException, ObjectNotFoundException;

    /**
     * 更新地区（更新指定字段）
     *
     * @param areaId id
     * @param name   地区编号
     * @param title  地区标题
     *               //     * @param adminArea 行政区
     */
    @Transactional
    Area update(Long areaId,
                String name,
                String title,
                String type,
                Long parentId)
            throws ArgumentErrorException, ObjectNotFoundException, UniqueConstraintsException;

    /**
     * 根据ID获得地区对象
     *
     * @param id id
     */
    Area findById(Long id);

    /**
     * 根据地区代码获得地区对象
     *
     * @param code 地区代码
     */
    Area findByCode(Long code);

    /**
     * 根据地区编号获得地区对象
     *
     * @param name 地区编号
     */
    Area findByName(String name);

    /**
     * 根据地区标题获得地区对象
     *
     * @param title 地区标题
     */
    Area findByTitle(String title);

    /**
     * 获得有单位关联的地区对象
     */
    Iterable<Area> findFirmAreas();

    /**
     * 根据单位代码获得单位关联的地区对象
     *
     * @param firmCode 单位代码
     */
    Area findFirmArea(Long firmCode);

    /**
     * 根据条件获得地区对象
     *
     * @param pageParam 分页对象
     */
    Iterable<Area> retrieve(String type,
                            Long parentId,
                            PageParam pageParam);

    /**
     * 根据单位获得所属地区
     *
     * @param firmId 单位ID
     */
    Iterable<Area> findAreaByFirmId(Long firmId);

    /**
     * 根据父地区ID查找子地区
     *
     * @param areaId
     * @return
     */
    Iterable<Area> findChildren(Long areaId);

    Area getAreaByStation(Long stationId);

    Iterable<Area> findAreasWithStation();
}
